package 网络编程;

import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;

/*
URI是抽象的定义，不管用什么方法表示，只要能定位一个资源，就叫URI，本来设想的的使用两种方法定位：
1，URL，用地址定位；
2，URN ，用名称定位。
举个例子：去村子找个具体的人（URI），如果用地址：某村多少号房子第几间房的主人 就是URL， 如果用身份证号+名字去找就是URN了。结果就是 目前WEB上就URL流行开了，
平常见的URI 基本都是URL。

URL 标准格式

scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor]

scheme //有我们很熟悉的http、https、ftp以及著名的ed2k，迅雷的thunder等。包括：data,file,ftp,http,mailto,magnet,telnet,urn
host   //HTTP服务器的IP地址或者域名
port#  //HTTP服务器的默认端口是80，这种情况下端口号可以省略。如果使用了别的端口，必须指明，例如tomcat的默认端口是8080 http://localhost:8080/
path   //访问资源的路径
url-params  //所带参数 主要作用就是向服务器提供额外的参数，用来表示本次请求的一些特性,例如ftp传输模式有两种，二进制和文本，type=d
query-string    //发送给http服务器的数据  通过get方式请求的参数,例如：www.qiandu.com/index.html?username=dgh&passwd=123
anchor //锚点定位  (Fragment)当html页面比较长时，我们通常会将其分为好几段，#1就可以快速定位到某一段



Java中的URI和URL
Java里面的注释定义

A URI is a uniform resource identifier while a URL is a uniform
resource locator. Hence every URL is a URI, abstractly speaking, but
not every URI is a URL. This is because there is another subcategory
of URIs, uniform resource names (URNs), which name resources but do
not specify how to locate them. The mailto, news, and isbn URIs shown
above are examples of URNs.

翻译过来就是

URI 是统一资源标识符，而 URL 是统一资源定位符。 因此，抽象地说，每个 URL 都是一个 URI，但并不是每个 URI 都是一个URL。 这是因为有另一个 URI 子类别，
统一资源名称(URN)，它命名资源但不指定如何定位它们
URL 是 URI 的一个子集，URL是 URI 其中的一种。

但是在Java的实现里面并没有URI和URL的继承关系啥的，他们两个都是final类

建议使用 URI 管理 URL 的编码和解码，并使用 URI.toURL() 和 URL.toURI() 进行转换。
如：
URI uri = URI.create("http://www.baidu.com");
URL url = uri.toURL();

public final class URI implements Comparable<URI>, Serializable
public final class URL implements java.io.Serializable

URI类中提供了转换到URL的方法

    public URL toURL()
        throws MalformedURLException {
        if (!isAbsolute())
            throw new IllegalArgumentException("URI is not absolute");
        return new URL(toString());
    }

URL类同样也提供了转换到URI的方法

    public URI toURI() throws URISyntaxException {
        URI uri = new URI(toString());
        if (authority != null && isBuiltinStreamHandler(handler)) {
            String s = IPAddressUtil.checkAuthority(this);
            if (s != null) throw new URISyntaxException(authority, s);
        }
        return uri;
    }

Java中对URI和URL的操作
URL由模式（协议），授权机构，路径，片段标识符，查询字符串组成。可通过如下方法获取：
getFile()，getHost()，getPort()，getProtocol()，getRef()，getQuery()，getPath()，getUserInfo()，getAuthority()
*/
public class uri与url {
    public static void urlTest(String str) throws Exception{
   	 URI u=URI.create(str);
   	 URL url=u.toURL();
   	 System.out.println(u.toASCIIString());
   	 System.out.println(url.toString());
        //URL url = new URL(str);
        System.out.println("URL：            " + url.toString());//http://user:password@www.gitee.com:80/yikoulinux/chat/blob/master/chat.h
        System.out.println("protocol：       " + url.getProtocol());//http
        System.out.println("Authority：      " + url.getAuthority());//user:password@www.gitee.com:80  授权机构
        System.out.println("file name：      " + url.getFile());///yikoulinux/chat/blob/master/chat.h
        System.out.println("host：           " + url.getHost());//www.gitee.com
        System.out.println("path：           " + url.getPath());///yikoulinux/chat/blob/master/chat.h
        System.out.println("port：           " + url.getPort());//80
        System.out.println("default port：   " + url.getDefaultPort());//80
        System.out.println("query：          " + url.getQuery());//null
        System.out.println("ref：            " + url.getRef());//null
    }

    public static void uriTest(String str) throws Exception{
        URI uri = new URI(str);
        System.out.println("URI                : " + uri.toString());//http://user:password@www.gitee.com:80/yikoulinux/chat/blob/master/chat.h
        System.out.println("scheme             : " + uri.getScheme());//http
        System.out.println("SchemeSpecificPart : " + uri.getSchemeSpecificPart());////user:password@www.gitee.com:80/yikoulinux/chat/blob/master/chat.h
        System.out.println("Authority          : " + uri.getAuthority());//user:password@www.gitee.com:80
        System.out.println("host               : " + uri.getHost());//www.gitee.com
        System.out.println("port               : " + uri.getPort());//80
        System.out.println("path               : " + uri.getPath());///yikoulinux/chat/blob/master/chat.h
        System.out.println("query              : "  + uri.getQuery());//null
        System.out.println("fragment           : " + uri.getFragment());//null
    }

    public static void main(String[] args) throws Exception {
   	 URI absolute = URI.create("http://localhost:8080/index.html");
   		URI relative = URI.create("/hello.html");
   		URI resolve = absolute.resolve(relative);
   		System.out.println(relative);///hello.html
   		System.out.println(resolve);//http://localhost:8080/hello.html
   		
   		String raw= "http://localhost:9090/index?name=张大doge";
   		String base = raw.substring(raw.lastIndexOf("//"));
   		System.out.println(base);
   		String pathLeft = base.substring(base.lastIndexOf("/") + 1);
   		System.out.println(pathLeft);
   		String[] array = pathLeft.split("\\?");
   		String path = array[0];
   		String query = array[1];
   		System.out.println(path);
   		System.out.println(query);
   		base = raw.substring(0,raw.lastIndexOf(path));
   		path = URLEncoder.encode(path, "UTF-8");
   		System.out.println(base);
   		System.out.println(path);
   	 
        //String str = "https://blog.csdn.net/qq_37774171/article/details/122539833?spm=1001.2014.3001.5501";
        String str = "http://user:password@www.gitee.com:80/yikoulinux/chat/blob/master/chat.h";
        System.out.printf("---------------------------------------\n");
        uri与url.urlTest(str);
        System.out.printf("---------------------------------------\n");
        uri与url.uriTest(str);
        
        URI uri = new URI("http://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");
        System.out.println("scheme   :"+uri.getScheme());//http       
        System.out.println("schemeSpecificPart   :"+uri.getSchemeSpecificPart());////www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123
        System.out.println("Authority   :"+uri.getAuthority());//www.qiandu.com:8080
        System.out.println("host   :"+uri.getHost());//www.qiandu.com
        System.out.println("port   :"+uri.getPort());//8080
        System.out.println("path   :"+uri.getPath());// /goods/index.html
        System.out.println("query   :"+uri.getQuery());//username=dgh&passwd=123
        System.out.println("fragment   :"+uri.getFragment());//jwse
/*
URI uri:
getScheme()
getRawSchemeSpecificPart()
getSchemeSpecificPart()
getRawAuthority()
getAuthority()
getRawUserInfo()
getUserInfo()
getHost()
getPort()
getRawPath()
getPath()
getRawQuery()
getQuery()
getRawFragment()
getFragment()
 */
        URL url = new URL("http://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");
        System.out.println("URL   :"+url.toString());//http://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se
        System.out.println("protocol   :"+url.getProtocol());// http
        System.out.println("Authority   :"+url.getAuthority());// www.qiandu.com:8080
        System.out.println("file name     :"+url.getFile());// /goods/index.html?username=dgh&passwd=123
        System.out.println("host   :"+url.getHost());// www.qiandu.com
        System.out.println("port   :"+url.getPort());// 8080
        System.out.println("path   :"+url.getPath());// /goods/index.html
        System.out.println("query   :"+url.getQuery());// username=dgh&passwd=123
        System.out.println("default port   :"+url.getDefaultPort());// 80
        System.out.println("ref      :"+url.getRef());//j2se
        /*
URL url
getHostAddress()
getQuery()
getPath()
getUserInfo()
getAuthority()
getPort()
getDefaultPort()
getProtocol()
getHost()
getFile()
getRef()
getContent()
getContent(Class<?>[])
getURLStreamHandler(String)
         */  
    }
}

